#include "myQueue.h"

// 初始化队列
void* initQueue()
{
    char* p = calloc(1,sizeof(queue_st));
    return p;
}

// 销毁队列
int destoryQueue(queue_st* q)
{
    qNode_st *current = q->head;

    while (current != NULL) {
        qNode_st *temp = current->next;
        free(current);
        current = temp;
    }
    // 销毁队列结构体
    // free(q); // 传进来的q是栈上的内存，不用释放
    return 0;
}

// 进队列
int inQueue(queue_st* q,qNode_st* node)
{
    qNode_st *new_node = malloc(sizeof(qNode_st));
    if (new_node == NULL) {
        printf("Error: malloc failed in enqueue.\n");
        return false;
    }
    // 初始化新结点
    new_node->fd = node->fd;
    memcpy(new_node->curPath,node->curPath,sizeof(new_node->curPath));
    printf("36node->username:%s\n",node->username);
    memcpy(new_node->username,node->username,sizeof(node->username));
    printf("38new_node->username:%s\n",new_node->username);
    new_node->next = NULL;

    // 开始进行尾插法插入一个结点
    // 分两种情况：如果尾插插入的是第一个结点需要同步更新头指针，否则仅需要更新尾指针
    if (q->head == NULL) {
        // 插入的是第一个结点
        q->head = new_node;
        q->tail = new_node;
    }
    else {
        // 插入的不是第一个结点
        q->head->next = new_node;
        q->tail = new_node;
    }
    return 0;
}

// 出队列,返回出队的socketfd
qNode_st* deQueue(queue_st* q,qNode_st* node) // 返回值为出队列的fd
{
    
     if (isEmpty(q)) {
        printf("Error: queue is empty.\n");
        exit(1);
    }
    node = calloc(1,sizeof(qNode_st));
    memcpy(node,q->head,sizeof(qNode_st));
    qNode_st *tmp = q->head;
    // 将出队的结点数据保存
    int remove_data = tmp->fd;

    // 更新队头指针
    q->head = tmp->next;
    if (q->head == NULL) {
        // 如果队头更新后,队列为空,说明出队的就是最后一个元素
        // 于是同步更新队尾指针
        q->tail = NULL;
    }

    free(tmp);
    q->size -= 1;
    return node;
}
// 打印队列中的值
void myPrint(queue_st* q)
{
    qNode_st* tmp = q->head;
    while(tmp != NULL)
    {
        printf("%d\n",tmp->fd);
        tmp = tmp->next;
    }
    tmp = NULL;
}

// 队列为空
bool isEmpty(queue_st* q)
{
    if(q->size == 0) return true;
    return false;
}

// 队列满了
bool isFull(queue_st* q,int threadMaxNum)
{
    if (q->size >= threadMaxNum) return true;
    return false;
}
